3.4.1 js new操作符

var Person = function(name){
   this.name  = name;
}
Person.prototype.sayHello = function() {
    console.log('hello ' + this.name);
}
var p1 = new Person('HANMEI');
p1.sayHello();
1
2
3
4
5
6
7
8

来看看var obj = new O()这条语句发生了什么:

var obj = (function(){
    var obj = {};
    obj.__proto__ = O.prototype;

    //其他赋值语句...

    return obj;
})();
1
2
3
4
5
6
7
8

也就是说var obj = new O()返回了一个obj对象,它的隐式原型链(proto)是指向O原型(prototype)的。这就是new的内部工作方式。

  • 1.创建一个类的实例:创建一个空对象obj,然后把这个空对象的__proto__设置为Person.prototype(即构造函数的prototype);

  • 2.初始化实例:构造函数Person被传入参数并调用,关键字this被设定指向该实例obj;

  • 3.返回实例obj。

New实现:

function New(F){
    var obj = {'__proto__': F.prototype};  /*第一步*/
    return function() {
        F.apply(obj, arguments);           /*第二步*/
        return obj;                        /*第三步*/
    }
}
1
2
3
4
5
6
7

instanceof

判断一个实例是否属于某种类型

其实 instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。

因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,

如果查找失败,则会返回 false,告诉我们左边变量并非是右边变量的实例。
1
2
3
4
5

参考